import axios from "axios"
import type { AxiosRequestConfig } from "axios"

// 定义通用的返回结果类型
interface Result<T> {
  code: number // 状态码
  data: T // 响应数据
  message: string // 响应信息
}

// 创建axios实例，配置默认参数
const instance = axios.create({
  baseURL: "http://localhost:8101", // 基础URL
  timeout: 10000, // 请求超时时间
  withCredentials: true // 跨域请求时是否需要使用凭证
})

// 请求拦截器
instance.interceptors.request.use(
  (config) => {
    return config
  },
  (err) => {
    return err
  }
)

// 响应拦截器
instance.interceptors.response.use(
  (res) => {
    const data = res.data

    if (data.code === 40100) {
      // 不是获取用户信息接口或者登录页面，则跳转到登录页面
      if (!res.request.responseURL.includes("user/get/login") && !window.location.pathname.includes("/user/login")) {
        window.location.href = `/user/login?redirect=${window.location.pathname}`
      }
    } else if (data.code !== 0) {
      throw new Error(data.message ?? "服务器错误")
    }

    return data
  },
  (err) => {
    return err
  }
)

// 封装通用的请求函数
function request<T>(config: AxiosRequestConfig) {
  return new Promise<Result<T>>((resolve, reject) => {
    instance
      .request<any, Result<T>>(config)
      .then((res) => resolve(res))
      .catch((err) => reject(err))
  })
}

function get<T = any>(config: AxiosRequestConfig) {
  return request<T>({ ...config, method: "GET" })
}

function post<T = any>(config: AxiosRequestConfig) {
  return request<T>({ ...config, method: "POST" })
}

export { get, post }
